/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../helper_objs/head.h"
#include "../config/head.h"
#include "../impl/head.h"
#include "../macro/head.h"
#include "../msg/head.h"
#include "file.h"

namespace xos_http
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static file::ITEM_DATA xos_item_data;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    file::file()
    {
        init_data();
    }

    file::~file()
    {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int file::get_xos_item_data( ITEM_DATA*& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int file::xos_sort_compare( const T & v ) const
    {
        int ret = 0;
        if( m_pModule && v.m_pModule )
        {
            ret = m_pModule->m_file.compare( v.m_pModule->m_file );
        }
        return ret;
    }

    int file::set_module( module::T * pM )
    {
        int ret = 0;
        if( m_pModule )
        {
            m_pModule->m_bDeleteFileWhenClose = true;
            xos_stl::release_ref( m_pModule );
        }
        pM->m_pFile = this;
        m_pModule = pM;
        pM->add_ref();
        return ret;
    }

    module::T * file::get_module()
    {
        m_pModule->add_ref();
        return m_pModule;
    }

    int file::remove_task( task * pTask )
    {
        int ret = 0;
        m_task_list.lock();
        m_task_list.erase( pTask->m_iter_in_file );
        m_task_list.un_lock();
        return ret;
    }

    // 正在处理才能加进通知列表
    int file::add_task( task * pTask )
    {
        int ret = 1;
        m_task_list.lock();
        if( 1 == m_pLockNum->get() )
        {
            m_task_list.push_front( (task::T *)pTask );
            pTask->m_iter_in_file = m_task_list.begin();
            ret = 0;
        }
        m_task_list.un_lock();
        return ret;
    }

    int file::notify_block_task()
    {
        int ret = 0;
        m_pLockNum->set( 0 );
        m_task_list.lock();
        for( task::ITER iter = m_task_list.begin(); iter != m_task_list.end(); ++iter )
        {
            xos_box::i_msg * pMsg = mgr::container()->box()->msg();
            task * pT = *iter;
            pMsg->set_void( 0, pT );
            pT->get_connect()->fast_notify()->notify( pMsg, FAST_JOB );
        }
        m_task_list.clear();
        m_task_list.un_lock();
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int file::init_data()
    {
        int ret = 0;
        m_full_gz_file = "";
        m_full_file = "";
        m_pFatherPath = 0;
        m_pModule = 0;
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int file::init()
    {
        int ret = 0;
        m_pLockNum = mgr::container()->box()->lnum();
        return ret;
    }

    int file::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pLockNum );
        xos_stl::release_ref( m_pModule );
        m_task_list.clear();
        init_data();
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

} // xos_http
